package bar.dark.lee.setting.category;

import java.util.HashMap;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import bar.dark.lee.BDConstents;
import bar.dark.lee.R;
import bar.dark.lee.SuperActivity;
import bar.dark.lee.common.BDUtil;
import bar.dark.lee.common.DBSQLite;
import bar.dark.lee.setting.TipInfoActivity;
import bar.dark.lee.setting.TipsActivity;

public class CategoryEditActivity extends SuperActivity
{
	private DBSQLite sql;
	
	private EditText name;
	private EditText count;
	
	private Button deleteButton;
	private Button updateButton;
	
	private Intent intent;
	private CategoryData data;
	
	private int categoryFlag;
	
	
	private String[] fixCategory = new String[]{
			BDConstents.CATEGORY_SUSUMONEY,
			BDConstents.CATEGORY_FAN_OUT_MONEY,
			BDConstents.CATEGORY_FAN_IN_MONEY,
			BDConstents.CATEGORY_FAN_OUT_CHECK,
			BDConstents.CATEGORY_FAN_IN_CHECK,
			BDConstents.CATEGORY_POST_OUT,
			BDConstents.CATEGORY_USE_CARD,
			BDConstents.CATEGORY_IN_CARD,
			BDConstents.CATEGORY_OUT_CARD,
			BDConstents.CATEGORY_OUT_BANK,
			BDConstents.CATEGORY_IN_BANK
		};
	
	private String tableName = "";
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		
		sql = DBSQLite.getInstance(this);
		
		setContentView(R.layout.setting_category_edit);
		
		setTitle("카테고리 수정");
		
		setFindView();
		initDataSetting();
		initClickListener();
		
		if (categoryFlag == -1)
		{
			dbError();
		}
	}

	private void dbError()
	{
		BDUtil.showDialog(this, "DB에러", "어플을 종료 후 다시 시도해주세요.");
	}

	private void setFindView()
	{
		name = (EditText) findViewById(R.id.categoryEditName);
		count = (EditText) findViewById(R.id.categoryEditCount);
		deleteButton = (Button) findViewById(R.id.categoryEditDeleteButton);
		updateButton = (Button) findViewById(R.id.categoryEditUpdateButton);
	}
	
	private void initDataSetting()
	{
		intent = getIntent();
		data = intent.getParcelableExtra(CategoryTabActivity.CATEGORY_DATA);
		categoryFlag = intent.getIntExtra(CategoryTabActivity.CATEGORY_FLAG, -1);
		
		name.setText(data.getKind());
		count.setText(data.getCount());
	}
	
	private void initClickListener()
	{
		deleteButton.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				BDUtil.showSelectDialog(superContext, "알림", "카테고리를 삭제 할 경우 예산으로 잡아 놓은 것도" +
						"같이 삭제 됩니다.", 
						new DialogInterface.OnClickListener()
				{
					@Override
					public void onClick(DialogInterface dialog, int which)
					{
						try
						{
							sql.beginTansaction(superContext);
							
							setDeleteData();
							
							sql.setTransactionSuccessful();
						} catch (Exception e)
						{
							BDUtil.btnEnable = true;
							BDUtil.asyncFlag = 0;
							
							BDUtil.showDialog(superContext, "오류", "데이터 저장에 실패했습니다.");
						} finally {
							try 
							{
								sql.endTransaction(superContext);
							} catch (Exception e) 
							{
								BDUtil.btnEnable = true;
								BDUtil.asyncFlag = 0;
								
								BDUtil.showDialog(superContext, "오류", "데이터 저장에 실패했습니다.");
							}
						}
					}
				});
			}
		});
		
		updateButton.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				if (name.getText().toString().length() < 1)
				{
					BDUtil.showDialog(superContext, "카테고리에러", "카테고리를 입력해주세요.");
					return;
				}
				
				if (!data.getKind().equals(name.getText().toString()))
				{
					if (BDUtil.getOverlapCheck(sql, superContext, "SELECT id FROM category_out_list WHERE kind = '"
							+ BDUtil.getApostrophe(name.getText().toString()) + "';"))
					{
						BDUtil.showDialog(superContext, "카테고리에러", "지출에 이미 같은 이름의 카테고리가 있습니다.");
						name.setText("");
						return;
					}
				}
				
				if (!data.getKind().equals(name.getText().toString()))
				{
					if (BDUtil.getOverlapCheck(sql, superContext, "SELECT id FROM category_in_list WHERE kind = '"
							+ BDUtil.getApostrophe(name.getText().toString()) + "';"))
					{
						BDUtil.showDialog(superContext, "카테고리에러", "수입에 이미 같은 이름의 카테고리가 있습니다.");
						name.setText("");
						return;
					}
				}
				
				if (!data.getKind().equals(name.getText().toString()))
				{
					if (BDUtil.getOverlapCheck(sql, superContext, "SELECT id FROM category_move_list WHERE kind = '"
							+ BDUtil.getApostrophe(name.getText().toString()) + "';"))
					{
						BDUtil.showDialog(superContext, "카테고리에러", "이동에 이미 같은 이름의 카테고리가 있습니다.");
						name.setText("");
						return;
					}
				}
				
				for (int i=0; i<fixCategory.length; i++) {
					if (name.getText().toString().equals(fixCategory[i])) {
						BDUtil.showDialog(superContext, "카테고리에러", "'"+fixCategory[i]+"'는 이미 고정된 카테고리로 사용중인 단어입니다.");
						name.setText("");
						return;
					}
				}
				
				if (name.getText().toString().equals(BDConstents.CATEGORY_SUSUMONEY))
				{
					BDUtil.showDialog(superContext, "카테고리에러", "'수수료'는 카테고리로 사용할수 없는 단어입니다.");
					name.setText("");
					return;
				}
				
				BDUtil.showSelectDialog(superContext, "알림", "카테고리를 수정 할 경우 예산, 자동화로 잡아 놓은 것과" +
						"내역의 카테고리도 같이 수정 됩니다.", 
						new DialogInterface.OnClickListener()
				{
					@Override
					public void onClick(DialogInterface dialog, int which)
					{
						try
						{
							sql.beginTansaction(superContext);
							
							setUpdateData();
							
							sql.setTransactionSuccessful();
						} catch (Exception e)
						{
							BDUtil.btnEnable = true;
							BDUtil.asyncFlag = 0;
							
							BDUtil.showDialog(superContext, "오류", "데이터 저장에 실패했습니다.");
						} finally {
							try 
							{
								sql.endTransaction(superContext);
							} catch (Exception e) 
							{
								BDUtil.btnEnable = true;
								BDUtil.asyncFlag = 0;
								
								BDUtil.showDialog(superContext, "오류", "데이터 저장에 실패했습니다.");
							}
						}
					}
				});
			}
		});
	}
	
	private void setDeleteData()
	{
		if (categoryFlag == 0)
		{
			tableName = "category_out_list";
			
			// 예산 테이블도 같이 삭제한다.
			String [] whereArgs2 = new String[]{data.getKind()};
			sql.delete(this, "budget_category", "name = ?", whereArgs2);
		}
		else if (categoryFlag == 1)
		{
			tableName = "category_in_list";
		}
		else if (categoryFlag == 2)
		{
			tableName = "category_move_list";
		}
		
		if (tableName.equals(""))
		{
			dbError();
			return;
		}
		
		String [] whereArgs = new String[]{data.getId()};
		sql.delete(this, tableName, "id = ?", whereArgs);
		
		AlertDialog.Builder dialog = new AlertDialog.Builder(this);
		dialog.setIcon(android.R.drawable.ic_dialog_info);
		dialog.setTitle("삭제");
		dialog.setMessage("카테고리 삭제가 완료 되었습니다.");
		dialog.setPositiveButton("확인", new DialogInterface.OnClickListener()
		{
			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				dialog.dismiss();
				finish();
			}
		});
		
		dialog.show();
	}
	
	private void setUpdateData()
	{
		String tableName = "";
		
		// 일반 자동화 테이블도 수정한다.
		HashMap<String, String> map3 = new HashMap<String, String>();
		map3.put("category", name.getText().toString());
		String [] whereArgs3 = new String[]{data.getKind()};
		sql.update(this, "auto_bank", map3, "category = ?", whereArgs3);
		
		// 내통장이체 테이블도 수정한다.
		HashMap<String, String> map4 = new HashMap<String, String>();
		map4.put("incategory", name.getText().toString());
		String [] whereArgs4 = new String[]{data.getKind()};
		sql.update(this, "auto_mybank", map4, "incategory = ?", whereArgs4);
		
		HashMap<String, String> map5 = new HashMap<String, String>();
		map5.put("outcategory", name.getText().toString());
		String [] whereArgs5 = new String[]{data.getKind()};
		sql.update(this, "auto_mybank", map5, "outcategory = ?", whereArgs5);
		
		if (categoryFlag == CategoryTabActivity.OUT)
		{
			tableName = "category_out_list";
			
			// 예산 테이블도 같이 수정한다.
			HashMap<String, String> map = new HashMap<String, String>();
			map.put("name", name.getText().toString());
			String [] whereArgs = new String[]{data.getKind()};
			sql.update(this, "budget_category", map, "name = ?", whereArgs);
			
			// 내역도 같이 수정한다.
			HashMap<String, String> map2 = new HashMap<String, String>();
			map2.put("category", name.getText().toString());
			String [] whereArgs2 = new String[]{data.getKind(), "0", 
					BDConstents.INOUT_TYPE,	BDConstents.OUTIN_TYPE,	BDConstents.MYBANK_INOUT_TYPE};
			sql.update(this, "in_out", map2, 
					"category = ? and inmoney = ? and type not in (?, ?, ?)", whereArgs2);
			
//			HashMap<String, String> map3 = new HashMap<String, String>();
//			map3.put("category", name.getText().toString());
//			String [] whereArgs3 = new String[]{data.getKind(), BDConstents.INOUT_TYPE};
//			sql.update(this, "in_out", map3, 
//					"category = ? and type = ?", whereArgs3);
		}
		else if (categoryFlag == CategoryTabActivity.IN)
		{
			tableName = "category_in_list";
			
			// 예산 테이블도 같이 수정한다.
			HashMap<String, String> map = new HashMap<String, String>();
			map.put("name", name.getText().toString());
			String [] whereArgs = new String[]{data.getKind()};
			sql.update(this, "budget_in_category", map, "name = ?", whereArgs);
			
			// 내역도 같이 수정한다.
			HashMap<String, String> map2 = new HashMap<String, String>();
			map2.put("category", name.getText().toString());
			String [] whereArgs2 = new String[]{data.getKind(), "0", "0", 
					BDConstents.INOUT_TYPE,	BDConstents.OUTIN_TYPE,	BDConstents.MYBANK_INOUT_TYPE};
			sql.update(this, "in_out", map2, 
					"category = ? and outmoney = ? and postmoney = ? and type not in (?, ?, ?)", whereArgs2);
			
//			HashMap<String, String> map3 = new HashMap<String, String>();
//			map3.put("category", name.getText().toString());
//			String [] whereArgs3 = new String[]{data.getKind(), BDConstents.OUTIN_TYPE};
//			sql.update(this, "in_out", map3, 
//					"category = ? and type = ?", whereArgs3);
		}
		else if (categoryFlag == CategoryTabActivity.MOVE)
		{
			tableName = "category_move_list";
			
			// 예산 테이블도 같이 수정한다.
			HashMap<String, String> map = new HashMap<String, String>();
			map.put("name", name.getText().toString());
			String [] whereArgs = new String[]{data.getKind()};
			sql.update(this, "budget_move_category", map, "name = ?", whereArgs);
			
			// 내역도 같이 수정한다.
			HashMap<String, String> map2 = new HashMap<String, String>();
			map2.put("category", name.getText().toString());
			String [] whereArgs2 = new String[]{data.getKind(), 
					BDConstents.INOUT_TYPE,	BDConstents.OUTIN_TYPE,	BDConstents.MYBANK_INOUT_TYPE};
			sql.update(this, "in_out", map2, 
					"category = ? and type = ? or type = ? or type = ?", whereArgs2);
		}
		
		HashMap<String, String> map = new HashMap<String, String>();
		map.put("kind", name.getText().toString());
		map.put("count", count.getText().toString());
		String [] whereArgs = new String[]{data.getId()};
		sql.update(this, tableName, map, "id = ?", whereArgs);
		
		AlertDialog.Builder dialog = new AlertDialog.Builder(this);
		dialog.setIcon(android.R.drawable.ic_dialog_info);
		dialog.setTitle("수정");
		dialog.setMessage("카테고리 수정이 완료 되었습니다.");
		dialog.setPositiveButton("확인", new DialogInterface.OnClickListener()
		{
			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				dialog.dismiss();
				finish();
			}
		});
		
		dialog.show();
	}

	@Override
	protected void tipButton()
	{
		Intent intnet = new Intent(this, TipInfoActivity.class);
		intnet.putExtra(TipsActivity.TIP_REQUEST_KEY, TipsActivity.TIP_CATEGORY);
		startActivity(intnet);
	}
}
